//
// Created by mmz on 2022/4/13.
//

#include "Classify.h"
#include <iostream>

// softmax
Eigen::MatrixXd Classify::softmax(const Eigen::MatrixXd &input) {
    Eigen::MatrixXd tmp = input.array() - input.maxCoeff();
    return tmp.array().exp() / tmp.array().exp().sum();
}

int Classify::operator()(cv::Mat &input_img) {
    float mean_value = 0.444;
    float std_value = 0.225;
    //图像归一化
    cv::Mat NormImg;
    input_img.convertTo(NormImg, CV_32FC1, 1.0  / (std_value * 255), (0.0 - mean_value) / std_value);//alpha * src + beta

    //使用dnn进行识别
    cv::Mat input = cv::dnn::blobFromImage(NormImg);
    Eigen::MatrixXd x;
    net.setInput(input);
    cv::Mat prob = net.forward();
    //将输出的向量转换并使用softmax归一化
    cv2eigen(prob,x);
    Eigen::MatrixXd output = softmax(x);
    Eigen::MatrixXd::Index minRow, minCol;//用来返回最大最小值的位置
    output.maxCoeff(&minRow, &minCol);

    if (output(minRow, minCol) > 0.60)
    {
        switch (minCol)
        {
            case 0:
                return 0;
            case 1:
                return 1;
            case 2:
                return 2;
            case 3:
                return 3;
            case 4:
                return 4;
            case 5:
                return 5;
            case 6:
                return 6;
            case 7:
                return 7;
            case 8:
                return 8;
            default:
                return 0;
        }
    } else
    {
        return 0;
    }
}

Classify::Classify() {

}
